package com.javaclimb.filmbuy.service;

import cn.hutool.core.collection.CollectionUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.javaclimb.filmbuy.dao.CommentInfoDao;
import com.javaclimb.filmbuy.dao.GoodsInfoDao;
import com.javaclimb.filmbuy.entity.CommentInfo;
import com.javaclimb.filmbuy.entity.GoodsInfo;
import com.javaclimb.filmbuy.entity.TypeInfo;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

/*
* 电影详情service层
* */
@Service
public class GoodsInfoService {

    @Resource
    private GoodsInfoDao goodsInfoDao;

    @Resource
    private TypeInfoService typeInfoService;

    @Resource
    private CommentInfoDao commentInfoDao;

    /**
     * 增加一个电影详情
     */
    public GoodsInfo add(GoodsInfo goodsInfo){
        //将文件列表转化成字符串返回电影对象
        covertList2String(goodsInfo);
        goodsInfoDao.insertSelective(goodsInfo);
        return goodsInfo;
    }

    /**
     * 根据主键id删除一个电影详情
     */
    public void delete(Long id){
        goodsInfoDao.deleteByPrimaryKey(id);
    }

    /**
     * 更新一个电影详情
     */
    public void update(GoodsInfo goodsInfo){
        //将文件列表转化成字符串返回电影对象
        covertList2String(goodsInfo);
        //增加点赞数
        if(goodsInfo.getHot()!=null){
            GoodsInfo goods = findById(goodsInfo.getId());
            goodsInfo.setHot(goods.getHot() + goodsInfo.getHot());
        }
        goodsInfoDao.updateByPrimaryKeySelective(goodsInfo);
    }

    /**
     * 根据主键id查询一个电影详情
     */
    public GoodsInfo findById(Long id){
        return goodsInfoDao.selectByPrimaryKey(id);
    }


    /**
     * 根据电影名称模糊查询电影详情对象列表，分页查询
     * @param name 电影名称，不是必选项
     * @param pageNum 要查询第几页
     * @param pageSize 每页多少条数据
     * @return 电影详情信息列表
     */
    public PageInfo<GoodsInfo> findPage(String name, Integer pageNum, Integer pageSize){
        PageHelper.startPage(pageNum,pageSize);
        List<GoodsInfo> byName = goodsInfoDao.findByName(name);
        for(GoodsInfo goodsInfo:byName){
            getRelInfo(goodsInfo);
        }
        return PageInfo.of(byName);
    }

    /**
     * 追加表里没有的数据项
     */
    private void getRelInfo(GoodsInfo goodsInfo){
        if(goodsInfo == null){
            return;
        }
        //根据电影类型id查询电影类型名称并追加到goodsInfo
        TypeInfo typeInfo = typeInfoService.findById(goodsInfo.getTypeId());
        if(typeInfo != null){
            goodsInfo.setTypeName(typeInfo.getName());
        }
    }

    /**
     * 将文件列表转化成字符串放回电影对象
     * @param goodsInfo
     */
    private void covertList2String(GoodsInfo goodsInfo){
        List<Long> fileList = goodsInfo.getFileList();
        if (!CollectionUtil.isEmpty(fileList)){
            goodsInfo.setFields(fileList.toString());
        }
    }

    /*根据电影类型查询最新的10条电影数据*/
    public List<GoodsInfo> findByTypeId(@Param("typeId")Integer typeId){
        return goodsInfoDao.findByTypeId(typeId);
    }

    /**
     * 热门电影
     * @param pageNum 第几页
     * @param pageSize 每页数量
     */

    public PageInfo<GoodsInfo> findRecommendGoods(int pageNum, int pageSize){
        PageHelper.startPage(pageNum,pageSize);
        List<GoodsInfo> list = goodsInfoDao.findRecommendGoods();
        return PageInfo.of(list);
    }
    /**
     * 热映 电影
     * @param pageNum 第几页
     * @param pageSize 每页数量
     */

    public PageInfo<GoodsInfo> findHotSalesGoods(int pageNum, int pageSize){
        PageHelper.startPage(pageNum,pageSize);
        List<GoodsInfo> list = goodsInfoDao.findHotSalesGoods();
        return PageInfo.of(list);
    }

    /*
     * 根据用户id和level查询已经看过的电影
     * */
    public List<GoodsInfo> getOrderGoods(Long userId,Integer level){
        List<GoodsInfo> list = goodsInfoDao.getOrderGoods(userId, level);
        if(CollectionUtil.isNotEmpty(list)){
            for(GoodsInfo goodsInfo: list){
                List<CommentInfo> commentInfoList = commentInfoDao.findByGoodsIdAndUserId(goodsInfo.getId(), userId,level);
                if(CollectionUtil.isEmpty(commentInfoList)){
                    goodsInfo.setCommentStatus("未评价");
                }else{
                    goodsInfo.setCommentStatus("已评价");
                }
            }
        }
        return list;
    }
    /**
     * 根据关键字搜索商品
     */
    public List<GoodsInfo> searchGoods(String text) {
        return goodsInfoDao.searchGoods(text);
    }
}












